#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

/**
 * Heron 算法（牛顿迭代法）求解平方根
 * @param y: 待求平方根的非负数
 * @return: √y 的近似值；若 y < 0，返回 NAN 并打印错误
 */
double heron_sqrt(double y) {
    // 输入校验：负数无实数平方根
    if (y < 0) {
        fprintf(stderr, "错误：无法计算负数的平方根\n");
        return NAN;
    }
    // 特殊值处理：0 的平方根是 0
    if (y == 0) {
        return 0.0;
    }

    // 初始化随机数生成器（仅初始化一次）
    static int rand_init = 0;
    if (!rand_init) {
        srand((unsigned int)time(NULL));  // 以系统时间为种子
        rand_init = 1;
    }

    // 生成 1~10000 的随机初始值 x（匹配 Python 的 random.randint(1,10000)）
    double x = (double)(rand() % 10000 + 1);  // rand()%10000 生成 0~9999，+1 后 1~10000

    // Heron 算法核心迭代：t = (x + y/x)/2，直到收敛
    while (1) {
        double t = (x + y / x) / 2.0;
        // 收敛判断：t == x（双精度浮点直接判等，与 Python 逻辑一致）
        if (t == x) {
            break;
        }
        x = t;
    }

    return x;
}

int main() {
    // 测试：计算 888 的平方根
    double y = 888.0;
    double a = heron_sqrt(y);

    // 检查是否计算出错（y 为负数时会返回 NAN）
    if (isnan(a)) {
        return EXIT_FAILURE;
    }

    // 输出 Heron 算法结果
    printf("%.15f %.15f\n", a, a * a);

    // 输出标准库 sqrt 函数结果
    double b = sqrt(y);
    printf("%.15f %.15f\n", b, b * b);

    return EXIT_SUCCESS;
}